<?php
declare(strict_types = 1);

namespace tool;

class DateTimeTool
{
	/**
	 * 时间格式转换时间戳
	 *
	 * @author Shanla
	 * @param string $date
	 * @return int 
	 */
	public function toTimestamp(string $date) : int
	{
		$date = strlen($date) == 10 ? $date . '00:00:00' : $date;

		return strtotime($date);
	}

	/**
	 * 时间戳转换成时间格式
	 *
	 * @author Shanla
	 * @param int $timestamp 时间戳
	 * @param string $format 格式
	 * @return string
	 */
	public function toDate(int $timestamp, string $format = 'Y-m-d H:i:s') : string
	{
		return $timestamp > 0 ? date($format, $timestamp) : '';
	}

	/**
	 * 秒数转换成倒计时
	 *
	 * @author Shanla
	 * @param int $second 秒数
	 * @return string
	 */
	public function toCountdown(int $second) : string
	{
		if ($second <= 0) {
			return '-';
		}

		$countDown = '';
		// 天
		$d = floor($second / 86400) ? floor($second / 86400) . '天' : '';
		// 时
		$h = floor($second % 86400 / 3600) ? floor($second % 86400 / 3600) . '时' : '';
		// 分
		$i = floor($second % 86400 % 3600 / 60) ? floor($second % 86400 % 3600 / 60) . '分' : '';
		// 秒
		$s = floor($second % 86400 % 3600 % 60 / 60) ? floor($second % 86400 % 3600 % 60 / 60) . '秒' : '';

		$countDown = $d . $h . $i . $s;

		return $countDown;
	}

	/**
	 * 获取当前月份
	 *
	 * @author Shanla
	 * @param int $time 时间
	 * @return string
	 */
	public static function getCurrentMonth(int $time = 0) : string
	{
		$time = $time ?: time();

		return date("Y-m", $time);
	}

	/**
	 * 获取下月月份
	 *
	 * @author Shanla
	 * @param int $time 时间
	 * @return string
	 */
	public static function getNextMonth(int $time = 0) : string
	{
		$time = $time ?: time();

		return date("Y-m", strtotime(date("Y-m-t 23:59:59", $time)) + 1);
	}

	/**
	 * 获取上月月份
	 *
	 * @author Shanla
	 * @param int $time 时间
	 * @return string
	 */
	public static function getPrevMonth(int $time = 0) : string
	{
		$time = $time ?: time();

		// 当前时间的月1号凌晨时间戳-1后为上个月的时间戳
		return date("Y-m", strtotime(date("Y", $time) . '-' . date("m", $time)) - 1);
	}

	/**
	 * 获取某月的最后一天
	 *
	 * @author Shanla
	 * @param string $month 月份
	 * @return string
	 */
	public static function getLastDayOnMonth(string $month) : string
	{
		if (empty($month)) {
			return '';
		}

		// 先获取当前月后的月份
		$nextMonth = date("Y-m", strtotime("+1 month", strtotime($month . '-01 00:00:00')));
		// 下个月的1号往前一天就是本月的最后一天
		$lastDay = date("Y-m-d", strtotime("-1 day", strtotime($nextMonth . "-01 00:00:00")));

		return $lastDay;
	}

	/**
	 * 获取两时间点内的月份数组
	 *
	 * @author Shanla
	 * @param int $startTime 开始时间
	 * @param int $endTime 结束时间
	 * @return array
	 */
	public static function getMonthsBetweenTime(int $startTime, int $endTime) : array
	{
		$monthArray = [];

		$monthArray[] = date("Y-m", $startTime);

		while ($startTime = strtotime("+1 month", $startTime) < $endTime) {
			$monthArray[] = date("Y-m", $startTime);
		}

		return $monthArray;
	}















}
